package user

import (
	"context"
	"github.com/gogf/gf/v2/errors/gerror"
	v1 "goAdminV1/api/user/v1"
	"goAdminV1/internal/model"
	"goAdminV1/internal/model/entity"
	"golang.org/x/crypto/bcrypt"
)

// UserCreate 处理用户创建
func (c *ControllerV1) UserCreate(ctx context.Context, req *v1.UserCreateReq) (*v1.UserCreateRes, error) {
	// 检查用户名是否已存在
	exists, err := model.ExistsByUsername(ctx, req.Username)
	if err != nil {
		return nil, gerror.New("检查用户名失败")
	}
	if exists {
		return nil, gerror.New("用户名已存在")
	}

	// 加密用户密码
	hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
	if err != nil {
		return nil, gerror.New("密码加密失败")
	}

	// 创建用户实体
	user := entity.CaUsers{
		Username:     req.Username,
		Email:        req.Email,
		Password:     string(hashedPassword),
		DepartmentId: req.DepartmentId,
	}

	// 插入用户数据
	userId, err := model.CreateUser(ctx, user)
	if err != nil {
		return nil, gerror.New("创建用户失败")
	}

	// 关联角色
	if len(req.Roles) > 0 {
		if err := model.InsertUserRoles(ctx, userId, req.Roles); err != nil {
			return nil, gerror.New("用户角色关联失败")
		}
	}

	// 关联岗位
	if len(req.Jobs) > 0 {
		if err := model.InsertUserJobs(ctx, userId, req.Jobs); err != nil {
			return nil, gerror.New("用户岗位关联失败")
		}
	}

	// 返回成功响应
	return &v1.UserCreateRes{
		UserId:  userId,
		Message: "用户创建成功",
	}, nil
}
